/**
 * 封装的axios
 */
import axios from 'axios'
import config from './config.js'
import qs from 'querystring'
import store from "@/store"
import { Message , MessageBox } from 'element-ui';
import router from "@/router"

//  let loadingInstance = Loading.service({ fullscreen: true });
/**
 * 错误函数 解析常用的http状态码
 * 2xx：成功
 * 3xx: 重定向
 * 4xx: 资源不存在
 * 5xx：服务器错误
 * 
 */
const ErrorHandle = (status, info) => {
    switch (status) {
        case 400:
            console.log('400-表示请求报文中存在语法错');
            break;
        case 401:
            console.log('401-未经许可，需要通过HTTP认证');
            break;
        case 403:
            console.log('403-服务器拒绝该次访问（访问权限出现问题）');
            break;
        case 404:
            console.log('404-表示服务器上无法找到请求的资源');
            break;
        case 500:
            console.log('500-表示服务器在执行请求时发生了错误，也有可能是web应用存在的bug或某些临时的错误时；');
            break;
        case 503:
            console.log('503-表示服务器暂时处于超负载或正在进行停机维护，无法处理请求');
            break;
        default:
            console.log(info);
            break;
    }
}


//自定义新建一个 axios 实例
const install = axios.create({
    headers: {
        'Content-Type': 'application/json'
    },
    baseURL: config.baseUrl ,//网络请求的基础路径 
    // timeout: 5000,//请求等待时间 时间到了后台没有返回数据 请求中段
})


//拦截器 
// 添加请求拦截器
install.interceptors.request.use(function (config) {

    //处理post请求发送的参数格式
    //  if(config.method==='post'){
    //      config.data = qs.stringify(config.data)//{} 转 xx=xx&xx=xx 
    //  }

    //配置请求token 
    let token = localStorage.getItem('token');
    if (token) {
        config.headers.Authorization = token;

    }

    // 在发送请求之前做些什么
    return config;

}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器
install.interceptors.response.use(
    response => {

        //200获取数据
        if (response.data.code == 200) {

            return response.data
            //410 token有问题,删除token,和vuex中的token
        } else if (response.data.code == 410) {

            //等于token清空
            localStorage.removeItem("token");
            store.commit("removetoken");

            //跳转到login
            router.push("/login")

            //500异常
            //财务密码修改
        } else if (response.data.code == 420) {
            
            switchPwn(response.data.code);
            //基础密码修改
        } else if (response.data.code == 430) {
            switchPwn(response.data.code);
            
            //删除订单权限密码
        } else if (response.data.code == 440) {

            switchPwn(response.data.code);
        } else {
            Message.error(response.data.info);
            return Promise.reject(response)
        }
    },
    error => {

        let { response } = error;
        // 对响应错误做点什么
        Message.error('服务器端错误');
        router.push("/login")
        //连接到服务器错误返回
        //  return Promise.reject(10000)
        //  ErrorHandle(response.status,response.info)

    });
//判断是否是财务,基础,删除订单权限
function switchPwn(params) {

    switch (params) {
        case 420:
            MessageBox.prompt('请输入财务密码!', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
              }).then(({ value }) => {
                    console.log(value);
                    install.post("/Login/CWCheckLogin",{
                        UserCWPwd:value,
                    }).then(res=>{
                        Message.success('验证成功!请再次进行操作');   
                        //保存到本地
                        localStorage.setItem("token", res.data.Token);
                        this.$store.state.token = res.data.Token;
                    }).catch(err=>{})

              }).catch(() => {
                Message({
                  type: 'info',
                  message: '取消输入'
                });       
              });

            break;
        case 430:
            MessageBox.prompt('请输入基础密码!', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
              }).then(({ value }) => {
                    install.post("/Login/JCCheckLogin",{
                        UserJCPwd:value,
                    }).then(res=>{
                        Message.success('验证成功!请再次进行操作');   
                        //保存到本地
                        localStorage.setItem("token", res.data.Token);
                        this.$store.state.token = res.data.Token;
                    }).catch(err=>{})  

              }).catch(() => {
                Message({
                  type: 'info',
                  message: '取消输入'
                });       
              });

            break;
        case 440:
            MessageBox.prompt('请输入删除订单权限密码!', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
              }).then(({ value }) => {
                    install.post("/Login/DELCheckLogin",{
                        UserDELPwd:value,
                    }).then(res=>{
                        Message.success('验证成功!请再次进行操作');   
                        //保存到本地
                        localStorage.setItem("token", res.data.Token);
                        this.$store.state.token = res.data.Token;
                    }).catch(err=>{})

              }).catch(() => {
                Message({
                  type: 'info',
                  message: '取消输入'
                });       
              });

            break;
        default:
            break;
    }

}

export default install;
